package com.xinyue.design.singleton;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 单例模式的功能是用来保证这个类在运行期间只会被创建一个类实例，另外单例模式还提供了一个全局唯一访问这个类实例的访问点，就是那个getInstance的方法。
 * 对于单例模式而言，不管采用何种实现方式，它都是只关心类实例的创建问题，并不关心具体的业务功能。
 * 
 * 单例模式的这种实现方式相比第二种静态实现方式是一种延迟加载的思想，就是一开始不要加载资源或者数据，
 * 等到马上就要使用这个资源或者数据了，躲不过去了才加载，所以也称Lazy Load，这在实际开发中是一种很常见的思想，尽可能的节约资源。
 * 
 * 单例模式的实现还体现了缓存的思想，缓存也是实际开发中非常常见的功能。
 * 把这些数据缓存到内存里面，每次操作的时候，先到内存里面找，如果有，那么就直接使用，如果没有那么就获取它，并设置到缓存中。
 * 下一次访问的时候就可以直接从内存中获取了。从而节省大量的时间，当然，缓存是一种典型的空间换时间的方案。
 */
public class Singleton1 {

	//定义一个变量来存储创建好的类实例
	private static Singleton1 singleton = null;
	
	private String name;
	private String password;
	private String gorup;
	
	public String getName() {
		return name;
	}
	public String getPassword() {
		return password;
	}
	public String getGorup() {
		return gorup;
	}
	
	//私有化构造方法：在内部控制创建实例的数目。也就是在外部不能随随便便就可以创建类实例，否则就无法控制创建的实例个数了。
	private Singleton1() {
		//初始化类属性
		readConfig();
	}
	
	public static synchronized Singleton1 getInstance() {
		//判断存储实例的变量是否有值
		if(singleton == null) {
			//没有，就创建一个类实例，并把值赋值给存储类实例的变量
			singleton = new Singleton1();
		}
		return singleton;
	}
	/*这种实现方式性能更好，因为上面的实现每次都需同步，下面的只有在第一次的时候才会同步。
	public static synchronized Singleton1 getInstance() {
		//判断存储实例的变量是否有值
		if(singleton == null) {
			synchronized(Singleton1.class){
				//再次检查实例是否存在，如果不存在才真的创建实例
                if(instance == null){
                    instance = new Singleton();
                }
			}
		}
		return singleton;
	}
	*/
	
	private void readConfig() {
		Properties proper = new Properties();
        InputStream is = null;
        try {
        	is = Singleton1.class.getResourceAsStream("testConfig.properties");
        	proper.load(is);
	        //把配置文件中的内容读出来设置到属性上
	        this.name = proper.getProperty("name");  
	        this.password = proper.getProperty("password"); 
	        this.gorup = proper.getProperty("gorup"); 
        }catch(Exception e) {
        	System.out.println(e.getMessage());
        }finally{
        	try {
				is.close();
			} catch (IOException e) {
				System.out.println(e.getMessage());
			}
        }
	}
}
